import java.util.ArrayList;


public class Grafo {
	
		private double[][] distancia;
	    private double[][] atracao;
	    private int        numCidades;
	    private double     atracaoTempoZero;
	    private ArrayList<Cidade> cidades;
	    private Problema p;
	    
	    public Grafo(int pNumCidades, double[][] pDistancia, double[][] pAtracao)
	    {
	        numCidades = pNumCidades;
	        distancia = pDistancia;
	        atracao = pAtracao;
	       
	    }
	    
	    public Problema getP() {
			return p;
		}

		public void setP(Problema p) {
			this.p = p;
		}

		public ArrayList<Cidade> getCidades() {
			return cidades;
		}

		public void setCidades(ArrayList<Cidade> cidades) {
			this.cidades = cidades;
		}

		public Grafo(ArrayList<Cidade> pCidades, double[][] pDistancia, Problema p)
	    {
	    	this(pCidades.size(),pDistancia, new double[pCidades.size()][pCidades.size()]);
	    	cidades = pCidades;
	    	this.p = p;
	    	resetaAtracao();
	    }
	    
	    public synchronized double getDistancia(int i, int j)
	    {
	        return distancia[i][j];
	    }
	    
	    public synchronized double getAtracao(int i, int j)
	    {
	        return atracao[i][j];
	    }
	    
	    public synchronized double getVisibilidade(int i, int j)
	    {
	        return ((double)1) / getDistancia(i, j);
	    }
	    
	    public synchronized int getNumCidades()
	    {
	        return numCidades;
	    }
	    
	    public synchronized double atracaoTempoZero()
	    {
	        return atracaoTempoZero;
	    }
	    
	    //Update do feromoneo localmente
	    public synchronized void atualizaAtracao(int i, int j, double valor)
	    {
	        atracao[i][j] = valor;
	    }
	    
	    //Reseta o feromoneo local
	    public void resetaAtracao()
	    {
	        double media = getMediaDistancia();
	        
	        atracaoTempoZero = (double)1 / ((double)numCidades * (0.5 * media));
	        
	        
	        for(int i = 0; i < getNumCidades(); i++)
	        {
	            for(int j = 0; j < getNumCidades(); j++)
	            {
	                atracao[i][j] = atracaoTempoZero;
	            }
	        } 
	    }
	    
	    public double getMediaDistancia(){
	    	return media(distancia);
	    }
	    public double getMediaAtracao(){
	    	return media(atracao);
	    }
	    
	    private double media(double matriz[][])
	    {
	        double soma = 0;
	        for(int i = 0; i < numCidades; i++)
	        {
	            for(int j = 0; j < numCidades; j++)
	            {
	                soma += matriz[i][j];
	            }
	        }
	        //Media é o feromoneo total somado de cada cidade dividido pelo número de combinações de cidades
	        double media = soma / (double)(numCidades * numCidades);
	        
	        return media;
	    }

}
